home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / wais / waisgate / wmessage.c < prev    next >
C/C++ Source or Header  |  1995-05-09  |  3KB  |  138 lines

  1. /* WIDE AREA INFORMATION SERVER SOFTWARE
  2.    No guarantees or restrictions.  See the readme file for the full standard
  3.    disclaimer.    
  4.    3.26.90
  5. */
  6.  
  7. /* This file is for reading and writing the wais packet header.
  8.  * Morris@think.com
  9.  */
  10.  
  11. #ifndef lint
  12. static char *RCSid = "$Header: /tmp_mnt/net/quake/proj/wais/wais-8-b5/ir/RCS/wmessage.c,v 1.2 92/02/12 13:56:35 jonathan Exp $";
  13. #endif
  14.  
  15. /* Change log:
  16.  * $Log:    wmessage.c,v $
  17.  * Revision 1.2  92/02/12  13:56:35  jonathan
  18.  * Added "$Log" so RCS will put the log message in the header
  19.  * 
  20.  * 
  21. */
  22.  
  23. /* to do:
  24.  *  add check sum
  25.  *  what do you do when checksum is wrong?
  26.  */
  27.  
  28. #include <string.h>
  29. #include "wmessage.h"
  30. #include "ustubs.h"
  31. #include "cutil.h"
  32.  
  33. /*---------------------------------------------------------------------*/
  34.  
  35. void 
  36. readWAISPacketHeader(msgBuffer,header_struct)
  37. char* msgBuffer;
  38. WAISMessage *header_struct;
  39. {
  40.   /* msgBuffer is a string containing at least HEADER_LENGTH bytes. */
  41.             
  42.   memmove(header_struct->msg_len,msgBuffer,(size_t)10); 
  43.   header_struct->msg_type = char_downcase((unsigned long)msgBuffer[10]);
  44.   header_struct->hdr_vers = char_downcase((unsigned long)msgBuffer[11]);
  45.   memmove(header_struct->server,(void*)(msgBuffer + 12),(size_t)10);
  46.   header_struct->compression = char_downcase((unsigned long)msgBuffer[22]);
  47.   header_struct->encoding = char_downcase((unsigned long)msgBuffer[23]);
  48.   header_struct->msg_checksum = char_downcase((unsigned long)msgBuffer[24]);
  49. }
  50.  
  51. /*---------------------------------------------------------------------*/
  52.  
  53. long
  54. getWAISPacketLength(header)
  55. WAISMessage* header;
  56. /* interpret the length field, this is necessary since the lenght in the
  57.    message is not null terminated, so atol() may get confused.
  58.  */
  59.   char lenBuf[11];
  60.   memmove(lenBuf,header->msg_len,(size_t)10);
  61.   lenBuf[10] = '\0';
  62.   return(atol(lenBuf));
  63. }
  64.  
  65. /*---------------------------------------------------------------------*/
  66.  
  67. #ifdef NOTUSEDYET
  68.  
  69. static char checkSum _AP((char* string,long len));
  70.  
  71. static char
  72. checkSum(string,len)
  73. char* string;
  74. long len;
  75. /* XXX the problem with this routine is that it can generate 
  76.    non-ascii values.  Since these values are not being hexized,
  77.    they can (and will) hang up some communication channels.
  78.    */
  79. {
  80.   register long i;
  81.   register char chSum = '\0';
  82.       
  83.   for (i = 0; i < len; i++)
  84.     chSum = chSum ^ string[i];
  85.         
  86.   return(chSum);
  87. }    
  88. #endif /* def NOTUSEDYET */
  89.  
  90. /* this modifies the header argument.  See wais-message.h for the different
  91.  * options for the arguments.
  92.  */
  93.  
  94. void
  95. writeWAISPacketHeader(header,
  96.               dataLen,
  97.               type,
  98.               server,
  99.               compression,
  100.               encoding,
  101.               version)
  102. char* header;
  103. long dataLen;
  104. long type;
  105. char* server;
  106. long compression;
  107. long encoding;
  108. long version;
  109. /* Puts together the new wais before-the-z39-packet header. */
  110. {
  111.   char lengthBuf[11];
  112.   char serverBuf[11];
  113.  
  114.   long serverLen = strlen(server);
  115.   if (serverLen > 10)
  116.     serverLen = 10;
  117.  
  118.   sprintf(lengthBuf, "%010ld", dataLen);  
  119.   strncpy(header,lengthBuf,10);
  120.  
  121.   header[10] = type & 0xFF; 
  122.   header[11] = version & 0xFF;
  123.  
  124.   strncpy(serverBuf,server,serverLen);       
  125.   strncpy((char*)(header + 12),serverBuf,serverLen);
  126.  
  127.   header[22] = compression & 0xFF;    
  128.   header[23] = encoding & 0xFF;    
  129.   header[24] = '0'; /* checkSum(header + HEADER_LENGTH,dataLen);   XXX the result must be ascii */    
  130. }              
  131.               
  132. /*---------------------------------------------------------------------*/
  133.  
  134.  
  135.  
  136.  
  137.